1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect;
18
19 import static com.google.common.base.Preconditions.checkNotNull;
20
21 import com.google.common.annotations.GwtCompatible;
22 import com.google.common.annotations.GwtIncompatible;
23
24 import java.io.IOException;
25 import java.io.ObjectInputStream;
26 import java.io.ObjectOutputStream;
27 import java.util.Collection;
28 import java.util.Comparator;
29 import java.util.NavigableMap;
30 import java.util.NavigableSet;
31 import java.util.SortedSet;
32 import java.util.TreeMap;
33 import java.util.TreeSet;
34
35 import javax.annotation.Nullable;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 @GwtCompatible(serializable = true, emulated = true)
79 public class TreeMultimap<K, V> extends AbstractSortedKeySortedSetMultimap<K, V> {
80 private transient Comparator<? super K> keyComparator;
81 private transient Comparator<? super V> valueComparator;
82
83
84
85
86
87 public static <K extends Comparable, V extends Comparable>
88 TreeMultimap<K, V> create() {
89 return new TreeMultimap<K, V>(Ordering.natural(), Ordering.natural());
90 }
91
92
93
94
95
96
97
98
99
100 public static <K, V> TreeMultimap<K, V> create(
101 Comparator<? super K> keyComparator,
102 Comparator<? super V> valueComparator) {
103 return new TreeMultimap<K, V>(checkNotNull(keyComparator),
104 checkNotNull(valueComparator));
105 }
106
107
108
109
110
111
112
113 public static <K extends Comparable, V extends Comparable>
114 TreeMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
115 return new TreeMultimap<K, V>(Ordering.natural(), Ordering.natural(),
116 multimap);
117 }
118
119 TreeMultimap(Comparator<? super K> keyComparator,
120 Comparator<? super V> valueComparator) {
121 super(new TreeMap<K, Collection<V>>(keyComparator));
122 this.keyComparator = keyComparator;
123 this.valueComparator = valueComparator;
124 }
125
126 private TreeMultimap(Comparator<? super K> keyComparator,
127 Comparator<? super V> valueComparator,
128 Multimap<? extends K, ? extends V> multimap) {
129 this(keyComparator, valueComparator);
130 putAll(multimap);
131 }
132
133
134
135
136
137
138
139
140
141 @Override SortedSet<V> createCollection() {
142 return new TreeSet<V>(valueComparator);
143 }
144
145 @Override
146 Collection<V> createCollection(@Nullable K key) {
147 if (key == null) {
148 keyComparator().compare(key, key);
149 }
150 return super.createCollection(key);
151 }
152
153
154
155
156 public Comparator<? super K> keyComparator() {
157 return keyComparator;
158 }
159
160 @Override
161 public Comparator<? super V> valueComparator() {
162 return valueComparator;
163 }
164
165
166
167
168
169
170
171 @Override
172 @GwtIncompatible("NavigableMap")
173 NavigableMap<K, Collection<V>> backingMap() {
174 return (NavigableMap<K, Collection<V>>) super.backingMap();
175 }
176
177
178
179
180 @Override
181 @GwtIncompatible("NavigableSet")
182 public NavigableSet<V> get(@Nullable K key) {
183 return (NavigableSet<V>) super.get(key);
184 }
185
186 @Override
187 @GwtIncompatible("NavigableSet")
188 Collection<V> unmodifiableCollectionSubclass(Collection<V> collection) {
189 return Sets.unmodifiableNavigableSet((NavigableSet<V>) collection);
190 }
191
192 @Override
193 @GwtIncompatible("NavigableSet")
194 Collection<V> wrapCollection(K key, Collection<V> collection) {
195 return new WrappedNavigableSet(key, (NavigableSet<V>) collection, null);
196 }
197
198
199
200
201
202
203
204
205
206
207 @Override
208 @GwtIncompatible("NavigableSet")
209 public NavigableSet<K> keySet() {
210 return (NavigableSet<K>) super.keySet();
211 }
212
213 @Override
214 @GwtIncompatible("NavigableSet")
215 NavigableSet<K> createKeySet() {
216 return new NavigableKeySet(backingMap());
217 }
218
219
220
221
222
223
224
225
226
227
228 @Override
229 @GwtIncompatible("NavigableMap")
230 public NavigableMap<K, Collection<V>> asMap() {
231 return (NavigableMap<K, Collection<V>>) super.asMap();
232 }
233
234 @Override
235 @GwtIncompatible("NavigableMap")
236 NavigableMap<K, Collection<V>> createAsMap() {
237 return new NavigableAsMap(backingMap());
238 }
239
240
241
242
243
244
245 @GwtIncompatible("java.io.ObjectOutputStream")
246 private void writeObject(ObjectOutputStream stream) throws IOException {
247 stream.defaultWriteObject();
248 stream.writeObject(keyComparator());
249 stream.writeObject(valueComparator());
250 Serialization.writeMultimap(this, stream);
251 }
252
253 @GwtIncompatible("java.io.ObjectInputStream")
254 @SuppressWarnings("unchecked")
255 private void readObject(ObjectInputStream stream)
256 throws IOException, ClassNotFoundException {
257 stream.defaultReadObject();
258 keyComparator = checkNotNull((Comparator<? super K>) stream.readObject());
259 valueComparator = checkNotNull((Comparator<? super V>) stream.readObject());
260 setMap(new TreeMap<K, Collection<V>>(keyComparator));
261 Serialization.populateMultimap(this, stream);
262 }
263
264 @GwtIncompatible("not needed in emulated source")
265 private static final long serialVersionUID = 0;
266 }